// ==UserScript==
// @name         干掉百度首页推荐标签 (增强版)
// @namespace    http://tampermonkey.net/
// @version      2.0
// @description  仅保留导航标签，并强制所有链接在当前页打开
// @author       sitorhy & laulguo
// @match        https://www.baidu.com/  
// @icon         https://www.baidu.com/favicon.ico
// @grant        none
// @license      MIT
// @updateURL    https://gitee.com/laulguo/personalrule/raw/master/%E5%B9%B2%E6%8E%89%E7%99%BE%E5%BA%A6%E9%A6%96%E9%A1%B5%E6%8E%A8%E8%8D%90%E6%A0%87%E7%AD%BE%E4%B8%AA%E4%BA%BA%E4%BF%AE%E6%94%B9%E7%89%88.user.js
// ==/UserScript==

(function () {
    'use strict';

    // =================================================================
    // START: 新增功能 - 强制所有链接在当前标签页打开
    // =================================================================

    /**
     * 使用 MutationObserver 监控 DOM 变化，
     * 并移除所有新添加的 a 标签的 target="_blank" 属性，
     * 从而强制链接在当前页面打开。
     */
    function forceLinksInCurrentTab() {
        // 定义处理节点（DOM元素）的函数
        const processNode = (node) => {
            // 确保是元素节点
            if (node.nodeType === 1) {
                // 查找该节点内部所有 target="_blank" 的链接
                const links = node.querySelectorAll('a[target="_blank"]');
                links.forEach(link => {
                    // 移除 target 属性
                    link.removeAttribute('target');
                });
                // 如果节点本身就是符合条件的链接，也处理一下
                if (node.matches('a[target="_blank"]')) {
                    node.removeAttribute('target');
                }
            }
        };

        // 1. 脚本加载时，先处理页面上已经存在的链接
        processNode(document.body);

        // 2. 创建一个 MutationObserver 实例来监听后续的 DOM 变动
        const observer = new MutationObserver((mutationsList) => {
            for (const mutation of mutationsList) {
                // 如果有新的节点被添加
                if (mutation.type === 'childList' && mutation.addedNodes.length > 0) {
                    // 遍历所有被添加的节点
                    mutation.addedNodes.forEach(node => {
                        // 对每个新节点及其子节点进行处理
                        processNode(node);
                    });
                }
            }
        });

        // 3. 配置 observer 开始监听 document.body 的子节点变化（包括深层子树）
        observer.observe(document.body, {
            childList: true, // 监听子节点的添加或删除
            subtree: true    // 监听所有后代节点
        });
    }

    // 立即执行该功能
    forceLinksInCurrentTab();

    // =================================================================
    // END: 新增功能
    // =================================================================


    // =================================================================
    // START: 原始脚本功能
    // =================================================================

    // 定义要保留的标签关键字
    const allFavTabText = ['关注'];
    const removeAiWrapper = true;

    const s_menus_wrapper = document.querySelector('#s_menus_wrapper');
    if (!s_menus_wrapper) return; // 如果找不到核心元素，直接退出

    const favTabs = Array.from(s_menus_wrapper.childNodes).filter(i => allFavTabText.some(j => i.innerText.indexOf(j) >= 0));

    const style = document.createElement('style');
    style.setAttribute('style', 'text/css');
    style.innerText = `
    .ai_app_wrapper_1ZRN3 { display: none }
    #s_menus_wrapper > span:nth-child(2) { display: none }
    `
    document.head.appendChild(style);

    function createClickTask(t) {
        return new Promise((resolve) => {
            const mine_tab = document.querySelector('#s_menu_mine');
            if (mine_tab) {
                mine_tab.click();
            }
            setTimeout(() => {
                if (mine_tab && mine_tab.classList.contains('current')) {
                    resolve(true);
                }
                else {
                    resolve(false);
                }
            }, t);
        });
    }

    // 可选的清除操作
    function clearOther() {
        setTimeout(() => {
            const hotNewDOM = document.querySelector('.hot-news-wrapper');
            if (hotNewDOM) {
                // 干掉热搜
                hotNewDOM.parentNode.removeChild(hotNewDOM);
            }

            const newListDOM = document.querySelector('.s-news-list-wrapper');
            if (newListDOM) {
                // 干掉推荐
                newListDOM.parentNode.removeChild(newListDOM);
            }

            // 干掉不感兴趣的标签
            if (s_menus_wrapper) {
                Array.from(s_menus_wrapper.childNodes).filter(i => !favTabs.includes(i)).forEach(j => j.parentNode.removeChild(j));
            }

            let observer;
            function removeTargets() {
                const ai_wrapper = document.querySelector('[class^="ai_app_wrapper"]');
                if (removeAiWrapper && ai_wrapper) {
                    ai_wrapper.parentNode.removeChild(ai_wrapper);
                }
            }

            // 原始脚本中的 observer 有一个逻辑问题，这里稍作优化
            // 它只在找到 ai_wrapper 后才执行一次，但 ai_wrapper 可能后续还会被添加
            // 更好的方式是只要检测到就移除
            const targetNode = document.querySelector('.san-card');
            if (!targetNode) return;

            // 初始检查一次
            removeTargets();

            observer = new MutationObserver((mutationsList, observer) => {
                // 每次变动都检查一次目标元素是否存在并移除
                removeTargets();
            });

            const config = { attributes: true, childList: true, subtree: true };
            observer.observe(targetNode, config);
        }, 0); // 使用 setTimeout(..., 0) 确保在其他初始化任务后执行
    }

    // 尝试点击10次 不行拉倒（一般不会超过3次）
    function* tryClick() {
        for (const i of [50, 100, 100, 100, 100, 200, 200, 300, 300, 300]) {
            const success = yield createClickTask(i);
            if (success) {
                clearOther();
                break;
            }
        }
    }

    function checkClick(g, success) {
        const { value, done } = success === undefined ? g.next() : g.next(success);
        if (!done) {
            value.then(success => {
                checkClick(g, success);
            });
        }
    }

    const mine_tab = document.querySelector('#s_menu_mine');
    if (mine_tab) {
        if (mine_tab.classList.contains('current')) {
            clearOther();
        }
        else {
            checkClick(tryClick(), undefined);
        }
    }
    // =================================================================
    // END: 原始脚本功能
    // =================================================================
})();